package com.thread.threadfirst.studyThread3;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.SynchronousQueue;

/**
 * 10、SynchronousQueue 同步队列
 * 同步容器，容量为0的同步队列，是一种特殊的TransferQueue，TransferQueue既可以调用transfer()方法绕过队列直接发送给消费者 实时处理消息，
 * 也可以调用put()、offer()、add()来将消息存放到队列中。而这种特殊的TransferQueue 不能将消息往队列中放 来的消息必须得有消费者马上消费掉，如果不消费就出问题了。
 * <p>
 * 就是一种特殊的TransferQueue，消息不能往消息队列中放，而是必须直接交给消费者消费。所以此容器就是空的 表面上的，发送的消息必须得有个消费者等着，
 * 直接交给消费者就好了。如果没有消费者消费，调用put()就会阻塞、调用add()报错。
 */
public class T8 {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> strs = new SynchronousQueue<>();  //同步容器，容量为0的同步队列，是一种特殊的TransferQueue

        new Thread(() -> {
            try {
                System.out.println(strs.take());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();

        strs.put("aa");  //此处的作用是阻塞 等待消费者消费（和LinkedBlockingQueue的put()作用(满了之后就等待 阻塞，有空了醒来再继续)是不一样的），里面实际用的是transfer()，
        // 它就是一种特殊的TransferQueue，消息不能往消息队列中放，而是必须直接交给消费者消费。
//        strs.add("aa");  //会抛异常：Queue full，因为此容器容量为0，所以不能用add()。得用put()。
        System.out.println(strs.size());
    }
}
